<?php
// vim: foldmethod=marker
/**
 *  Xanhte_Plugin_Validator_Kana.php
 *
 *  @author     ITOH Takashi <itoh@junoe.jp>
 *  @license    http://www.opensource.org/licenses/bsd-license.php The BSD License
 *  @package    Xanhte
 *  @version    $Id: Xanhte_Plugin_Validator_Kana.php 163 2008-03-11 18:54:07Z mikhail.miguel $
 */

// {{{ Xanhte_Plugin_Validator_Kana
/**
 *  UTF-8でカタカナ/ひらがなのみ
 *
 *  @author     ITOH Takashi <itoh@junoe.jp>
 *  @access     public
 *  @package    Xanhte
 */
define('ETHNA_PLUGIN_VALIDATE_KATAKANA', 1);
define('ETHNA_PLUGIN_VALIDATE_HIRAGANA', 2);
define('ETHNA_PLUGIN_VALIDATE_KANA', 3);
class Xanhte_Plugin_Validator_Kana extends Ethna_Plugin_Validator
{
	/** @var    bool    配列を受け取るかフラグ */
	var $accept_array = false;

	/**
     *  UTF-8でカタカナ/ひらがなのみ
	 *
	 *  @access public
	 *  @param  string  $name       フォームの名前
	 *  @param  mixed   $var        フォームの値
	 *  @param  array   $params     プラグインのパラメータ
	 */
	function &validate($name, $var, $params)
	  {
		  $true = true;
		  $type = $this->getFormType($name);
		  if (isset($params['kana']) == false || $this->isEmpty($var, $type)) {
			  return $true;
		  }
		  
		  $katakana_regexp = '(\xe3(\x82[\xa1-\xbf]|\x83[\x80-\xbf]))';
		  $hiragana_regexp = '(\xe3(\x81[\x80-\xbf]|\x82[\x80-\xa0]))';
		  switch ($params['kana']){
			case ETHNA_PLUGIN_VALIDATE_KATAKANA :
			  $regexp = sprintf('/^%s*$/', $katakana_regexp);
			  $error_msg = "{form}はカタカナで入力してください";
			  break;
			case ETHNA_PLUGIN_VALIDATE_HIRAGANA :
			  $regexp = sprintf('/^%s*$/', $hiragana_regexp);
			  $error_msg = "{form}はひらがなで入力してください";
			  break;
			default:
			  $regexp = sprintf('/^(%s|%s)*$/', $hiragana_regexp, $katakana_regexp);
			  $error_msg = "{form}はカタカナかひらがなで入力してください";
		  }
		  
		  switch ($type) {
			case VAR_TYPE_STRING:
			  if (!preg_match($regexp, $var)){
				  if (isset($params['kana_error'])) {
					  $msg = $params['kana_error'];
				  } else {
					  $msg = $error_msg;
				  }
				  return Ethna::raiseNotice($msg, E_FORM_MAX_STRING,
											array($params['kana']));
			  }
			  break;
		  }

		  return $true;
	  }
}
// }}}
?>
